package org.jmpo;

import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;
import java.util.stream.Stream;

/**
 * @ParametrizedTest позволяет вызвать один и тот же тест, но с разными 
 * параметрами. Например мы можем вызвать тесты для метода
 * SimpleMethod.square с разными числами.
 */

public class ParameterizedSimpleMethodTest {
    /**
     * Метод, который будет поставлять нам данные.
     * Он поставляет набор элементов типа Arguments.
     * Каждый Arguments - это набор аргументов для основного
     * тестирующего метода. Они будут переданы в метод
     * в том порядке, как следуют в Arguments.
     */
    public static Stream<Arguments> squareTestArguments() {
        return Stream.of(
            Arguments.of(0, 0), // input, expected
            Arguments.of(1, 1),
            Arguments.of(2, 4),
            Arguments.of(-1, 1),
            Arguments.of(-2, 4),
            Arguments.of(32, 1024),
            Arguments.of(Integer.MAX_VALUE, 1)
        );
    }

    /** 
     * Основной тестирующий метод.
     * Метод будет принимать два параметра: input - данные для тестируемого метода,
     * expected - ожидаемый результат.
     */ 
    @ParameterizedTest // парметризованный тест для многократного вызова
    @MethodSource("squareTestArguments")      // источником служит метод, генерирующий параметры
    public void parameterizedSimpleMethodTest(int input, int expected) {
        var actual = SimpleMethod.square(input);
        assertEquals(expected, actual);
    }
}
